home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / b / b.lha / B / doc / UsersGuide.ms < prev   
Encoding:
Text File  |  1988-11-24  |  22.6 KB  |  898 lines

  1. .TL \" Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984.
  2. A User's Guide to the B system
  3. .AU
  4. Steven Pemberton
  5. CWI, Amsterdam
  6. .ds B \fIB\fP
  7. .so bfont.def
  8. .AB
  9. \*B is a new interactive programming language being developed at the CWI.
  10. This report gives a brief introduction to using the current \*B implementation.
  11. It does not teach you about the language, for which you should refer elsewhere.
  12. .AE
  13. .SH
  14. .bp
  15. Introduction
  16. .PP
  17. .de BX
  18. 'nh
  19. \v'-\\n(.su/2u'\(br\v'\\n(.su/2u'\|\\$1\|\v'-\\n(.su/2u'\(br\v'\\n(.su/2u'\\h'-\\w'|'u/2u'\l'|0+(\\w'|'u/2u)\(rn'\\h'-\\w'|'u/2u'\l'|0\(ul'\\$2
  20. 'hy
  21. ..
  22. .de BR
  23. [\\$1]\\$2
  24. ..
  25. .de KY
  26. .ie t .BX \\$1 \\$2
  27. .el .BR \\$1 \\$2
  28. ..
  29. This guide is a brief introduction to using the current \*B system.
  30. It does not attempt to teach you about the language,
  31. for which you should refer elsewhere.
  32. .PP
  33. Furthermore, certain details such as how to start the system up,
  34. and which keys on your terminal correspond to the keys mentioned,
  35. depend on your local installation, and are not mentioned in this guide.
  36. Keys are just referred to here by their name, such as
  37. .KY accept .
  38. Refer to the ``bterminal(5)'' manual entry for these details.
  39. .PP
  40. Some older \*B systems don't let you make changes to immediate commands,
  41. nor give you suggestions to immediate commands, but only in units.
  42. .SH
  43. Starting up
  44. .PP
  45. The first response you should get from the \*B system when you start it up
  46. is a prompt that looks like this:
  47. .DS
  48. \*(<:>>> _?\*(:>
  49. .DE
  50. The underlined question mark is the indication from the \*B system
  51. that it is expecting input from you.
  52. (In fact, it depends on the sort of terminal you have
  53. whether it is underlined, displayed in reverse video, or what.
  54. In any case it is displayed in some special way,
  55. and we shall use underlining in this guide.)
  56. When it follows the three arrows \*(<:>>>\*(:>, called the \fIcommand prompt\fP,
  57. it is expecting you to type in a command.
  58. The question mark is called a \fIhole\fP
  59. and indicates that something should be filled in;
  60. the underline is called the \fIfocus\fP
  61. and shows where you are currently working.
  62. .PP
  63. You can fill this hole by typing in a \*(<:WRITE\*(:> command for instance:
  64. you type a \*(<:W\*(:>
  65. (which you don't have to type in upper-case:
  66. the system knows that it may only be upper-case here),
  67. and you immediately see:
  68. .DS
  69. \*(<:>>> W_?RITE ?\*(:>
  70. .DE
  71. This extra stuff to the right of the focus is a \fIsuggestion\fP.
  72. Most times that you type a \*(<:W\*(:> as the first letter of a command,
  73. it is because you want a \*(<:WRITE\*(:>.
  74. Therefore the editor suggests this,
  75. with an additional hole for the expression that you want to write.
  76. If you do want a \*(<:WRITE\*(:>
  77. (as in this case)
  78. you may press the
  79. .KY accept
  80. key to accept the suggestion \(em the editor
  81. then moves to the first unfilled hole in the command,
  82. which in this case is the only one,
  83. and you get:
  84. .DS
  85. \*(<:>>> WRITE _?\*(:>
  86. .DE
  87. You can now type an expression and press the
  88. .KY newline
  89. key.
  90. The system evaluates the expression,
  91. prints the result,
  92. and then gives you a new command prompt.
  93. Here are a few examples of \*(<:WRITE\*(:> commands:
  94. .DS
  95. \*(<:>>> WRITE 2+2
  96. 4
  97. >>> WRITE root 2
  98. 1.414213562373095
  99. >>> WRITE pi
  100. 3.141592653589793\*(:>
  101. .DE
  102. If you make a mistake while typing and spot it before you type
  103. .KY newline ,
  104. an easy way to correct it is to use the
  105. .KY back
  106. key.
  107. Pressing
  108. .KY back
  109. takes you back to the situation before you typed
  110. the last key (\fIexactly\fP the situation,
  111. as you will see clearly after a little use).
  112. If you type
  113. .KY back
  114. twice,
  115. you will be taken back to the situation as it was two keys ago,
  116. and so forth.
  117. You can regard the
  118. .KY back
  119. key as a way of travelling back in time.
  120. .LP
  121. Thus, if you meant to type \*(<:WRITE pi\*(:>,
  122. but instead typed \*(<:WRITE po\*(:>,
  123. you will see this:
  124. .DS
  125. \*(<:>>> WRITE po_?\*(:>
  126. .DE
  127. Now pressing
  128. .KY back
  129. will give you
  130. .DS
  131. \*(<:>>> WRITE p_?\*(:>
  132. .DE
  133. Now you can type the \*(<:i\*(:> and the
  134. .KY newline .
  135. Currently you can only go back a maximum of 100 keystrokes,
  136. and in any case only as far as the command prompt
  137. (and thus not back to previous commands).
  138. You will see other ways to correct mistakes shortly.
  139. .PP
  140. If you make a mistake so that the result is illegal \*B,
  141. but don't notice before you press
  142. .KY newline
  143. you will get an error message:
  144. .DS
  145. \*(<:>>> WRITE root 3**2+4**2
  146. *** There's something I don't understand in your command
  147.     WRITE root 3**2+4**2
  148.                  ^
  149. *** The problem is: priorities? use ( and ) to resolve\*(:>
  150. .DE
  151. The problem here is that the system doesn't know
  152. if you want to apply \*(<:root\*(:> to \*(<:3\*(:> or \*(<:3**2\*(:> or \*(<:3**2+4**2\*(:>
  153. and you should use brackets to show which.
  154. .PP
  155. When you type an open bracket,
  156. the system automatically supplies the matching closing bracket for you:
  157. .DS
  158. \*(<:>>> WRITE root(_?)\*(:>
  159. .DE
  160. You now type in the expression
  161. .DS
  162. \*(<:>>> WRITE root(3**2+4**2_?)\*(:>
  163. .DE
  164. You may now type
  165. .KY newline
  166. \^(
  167. .KY accept
  168. will take you over the closing bracket,
  169. but it is not necessary to do this):
  170. .DS
  171. \*(<:>>> WRITE root(3**2+4**2)
  172. 5\*(:>
  173. .DE
  174. .LP
  175. You can write any legal \*B value:
  176. .DS
  177. \*(<:>>> WRITE {1..10}
  178. {1; 2; 3; 4; 5; 6; 7; 8; 9; 10}
  179. >>> WRITE 'Hello! '^^3
  180. Hello! Hello! Hello!\*(:>
  181. .DE
  182. Just as with brackets,
  183. the system automatically supplies the closing brace \*(<:}\*(:>,
  184. and the closing quote \*(<:'\*(:>.
  185. In the latter case,
  186. where you want to type something after the closing quote
  187. you may either use
  188. .KY accept
  189. or type the quote yourself,
  190. in order to position after it.
  191. .PP
  192. Commands typed as a response to the command prompt
  193. are called `immediate' commands,
  194. since they are executed immediately.
  195. Another example is the \*(<:PUT\*(:> command.
  196. Just as with \*(<:WRITE\*(:>,
  197. when you type the first letter of the command,
  198. the system provides a suggestion:
  199. .DS
  200. \*(<:>>> P_?UT ? IN ?\*(:>
  201. .DE
  202. Again,
  203. you use
  204. .KY accept
  205. to go to the first hole:
  206. .DS
  207. \*(<:>>> PUT _? IN ?\*(:>
  208. .DE
  209. Here you type an expression,
  210. .DS
  211. \*(<:>>> PUT root 2?_ IN ?\*(:>
  212. .DE
  213. followed by another
  214. .KY accept
  215. to take you to the second hole:
  216. .DS
  217. \*(<:>>> PUT root 2 IN _?\*(:>
  218. .DE
  219. where you can type a target,
  220. followed by
  221. .KY newline :
  222. .DS
  223. \*(<:>>> PUT root 2 IN a
  224. >>> PUT root 3 IN b
  225. >>> WRITE a
  226. 1.414213562373095
  227. >>> WRITE b
  228. 1.732050807568877
  229. >>> WRITE a,b
  230. 1.414213562373095 1.732050807568877
  231. >>> WRITE a*a, b*b
  232. 2 3\*(:>
  233. .DE
  234. The targets that you create in this way,
  235. through immediate commands,
  236. are called `permanent targets',
  237. because if you stop using the system,
  238. and log out,
  239. and come back later and start using the system again
  240. you will find that the targets are still there,
  241. with the same values as before.
  242. .PP
  243. You can find out which targets exist
  244. by typing two equals signs after the prompt:
  245. .DS
  246. \*(<:>>> ==
  247. a b
  248. >>> PUT 'hello', {1..10} IN message, list
  249. >>> ==
  250. a b list message
  251. >>> WRITE list
  252. {1; 2; 3; 4; 5; 6; 7; 8; 9; 10}
  253. >>> WRITE message
  254. hello\*(:>
  255. .DE
  256. To get rid of targets you no longer want, use the \*(<:DELETE\*(:> command:
  257. .DS
  258. \*(<:>>> DELETE a, b
  259. >>> ==
  260. list message
  261. >>> WRITE a
  262. *** Can't cope with problem in your command
  263.     WRITE a
  264. *** The problem is: a has not yet received a value\*(:>
  265. .DE
  266. As you can see,
  267. after the \*(<:DELETE\*(:> command both \*(<:a\*(:> and \*(<:b\*(:> have ceased to exist.
  268. .SH
  269. Other Immediate Commands
  270. .PP
  271. In fact,
  272. almost any \*B command can be used as an immediate command;
  273. the only exceptions are the commands used to terminate \*(<:TEST\*(:>s and \*(<:YIELD\*(:>s,
  274. namely \*(<:RETURN\*(:>, \*(<:REPORT\*(:>, \*(<:SUCCEED\*(:> and \*(<:FAIL\*(:>.
  275. .DS
  276. \*(<:>>> WRITE list
  277. {1; 2; 3; 4; 5; 6; 7; 8; 9; 10}
  278. >>> INSERT 5 IN list
  279. >>> REMOVE 6 FROM list
  280. >>> WRITE list
  281. {1; 2; 3; 4; 5; 5; 7; 8; 9; 10}
  282. >>> CHOOSE number FROM list
  283. >>> WRITE number
  284. 9
  285. >>> CHECK 5 in list
  286. >>> CHECK 6 in list
  287. *** Your check failed in your command
  288.     CHECK 6 in list
  289. >>> FOR i IN list: WRITE 10*i
  290. 10 20 30 40 50 50 70 80 90 100
  291. >>> ==
  292. list message number\*(:>
  293. .DE
  294. Note that a \*(<:CHECK\*(:> command that succeeds doesn't print any message.
  295. Also note carefully that
  296. the target \*(<:i\*(:> used in the \*(<:FOR\*(:> command doesn't exist afterwards.
  297. .PP
  298. When you want to type a \*(<:WHILE\*(:> command,
  299. and you type the initial \*(<:W\*(:>,
  300. the suggestion you get is of course \*(<:W_?RITE ?\*(:>.
  301. Here you must type an \*(<:H\*(:>,
  302. and the system then suggests
  303. .DS
  304. \*(<:>>> WH_?ILE ?:\*(:>
  305. .DE
  306. Now you can press
  307. .KY accept
  308. to go to the hole,
  309. type the test,
  310. and press
  311. .KY newline :
  312. .DS
  313. \*(<:>>> WHILE list <> {}:
  314.         _?\*(:>
  315. .DE
  316. Because the \*B system knows that the commands of a \*(<:WHILE\*(:> must be indented,
  317. it indents for you automatically.
  318. You may now type in the commands to be part of the \*(<:WHILE\*(:>,
  319. and each time the system indents you to the right place.
  320. After the last command you just need to type an extra
  321. .KY newline ,
  322. and the system undoes the indentation one level,
  323. and executes the \*(<:WHILE\*(:>.
  324. (If there is only one simple command to be repeated,
  325. it may be on the same line as the \*(<:WHILE\*(:>,
  326. but doesn't have to be).
  327. .DS
  328. \*(<:>>> WHILE list <> {}:
  329.         CHOOSE number FROM list
  330.         REMOVE number FROM list
  331.         WRITE number
  332. 2 8 4 7 9 5 3 1 5 10
  333. >>> WRITE list
  334. {}\*(:>
  335. .DE
  336. .SH
  337. Finishing a B Session
  338. .PP
  339. The one command that has a different meaning when you type it after a prompt
  340. is \*(<:QUIT\*(:>,
  341. which just terminates the \*B session.
  342. When you type the \*(<:Q\*(:> you will get a suggestion as usual.
  343. .DS
  344. \*(<:>>> Q_?UIT\*(:>
  345. .DE
  346. Here there are no holes,
  347. but you must still press
  348. .KY accept
  349. to accept the suggestion,
  350. before pressing
  351. .KY newline .
  352. .SH
  353. Making your own Commands
  354. .PP
  355. You can create your own commands by typing in a how-to unit
  356. that defines what your command means.
  357. Suppose you type in response to the \*B prompt:
  358. .DS
  359. \*(<:>>> HOW'TO GREET:
  360.         WRITE 'Hello'\*(:>
  361. .DE
  362. The system gives a suggestion for \*(<:HOW'TO\*(:>,
  363. and supplies indentation for you,
  364. just as with \*(<:WHILE\*(:>,
  365. and you finish by pressing
  366. .KY newline
  367. until you get the command prompt again.
  368. Well,
  369. now you've defined your first command,
  370. and can execute it by typing its name after the prompt.
  371. You will notice that after typing the \*(<:G\*(:> you will get a suggestion for it:
  372. .DS
  373. \*(<:>>> G_?REET\*(:>
  374. .DE
  375. Just as with \*(<:QUIT\*(:>,
  376. there are no holes,
  377. but you must
  378. .KY accept
  379. the suggestion.
  380. .DS
  381. \*(<:>>> GREET_?\*(:>
  382. .DE
  383. Now press
  384. .KY newline
  385. and your command gets executed,
  386. and you get the prompt again:
  387. .DS
  388. \*(<:>>> GREET
  389. Hello
  390. >>>\*(:>
  391. .DE
  392. You may use your own commands just like any in-built command:
  393. .DS
  394. \*(<:>>> FOR i IN {1..10}: GREET
  395. HelloHelloHelloHelloHelloHelloHelloHelloHelloHello\*(:>
  396. .DE
  397. .SH
  398. Correcting errors
  399. .PP
  400. Apart from
  401. .KY back ,
  402. another way of correcting errors is to correct a whole line.
  403. Here you use the ability to move the focus about.
  404. Earlier the focus was a single character,
  405. just the hole.
  406. However,
  407. the focus may be more than one character: it may be several characters,
  408. a whole command,
  409. or even several commands.
  410. .PP
  411. Two of the eight keys for moving the focus are
  412. .KY up
  413. and
  414. .KY down .
  415. .PP
  416. The
  417. .KY up
  418. key moves the focus up to the previous line
  419. so that it includes the whole line.
  420. So if you have the following situation:
  421. .DS
  422. \*(<:>>> FOR i IN {1..3}:
  423.         WRITE /
  424.         GREET
  425.         WRITE /_?\*(:>
  426. .DE
  427. then typing
  428. .KY up
  429. gives you
  430. .DS
  431. \*(<:>>> FOR i IN {1..3}:
  432.         WRITE /
  433.         GREET_____
  434.         WRITE /\*(:>
  435. .DE
  436. Here the hole in the last line has disappeared
  437. (because the line is legal \*B)
  438. and the focus has moved up to the whole of the preceding line.
  439. You may press
  440. .KY up
  441. several time to go up several lines.
  442. So,
  443. pressing
  444. .KY up
  445. again gives:
  446. .DS
  447. \*(<:>>> FOR i IN {1..3}:
  448.         WRITE /_______
  449.         GREET
  450.         WRITE /\*(:>
  451. .DE
  452. The
  453. .KY down
  454. key does the same but in the other direction.
  455. .PP
  456. Now the point of all this is,
  457. that if you have a line in a command or unit that you want to change,
  458. you can move the focus to it,
  459. and press
  460. .KY delete
  461. to get rid of it.
  462. This leaves a hole in its place so that you can type a replacement line:
  463. .DS
  464. \*(<:>>> FOR i IN {1..3}:
  465.         ?_
  466.         GREET
  467.         WRITE /\*(:>
  468. .DE
  469. If you don't want to replace the line,
  470. but completely delete it,
  471. then pressing
  472. .KY delete
  473. again deletes the hole too:
  474. .DS
  475. \*(<:>>> FOR i IN {1..3}:
  476.         GREET_____
  477.         WRITE /\*(:>
  478. .DE
  479. .SH
  480. Changing Existing Units
  481. .PP
  482. Just as you can type two equals signs
  483. to find out what permanent targets you have,
  484. you can type two colons to
  485. find out what units you have in the current workspace.
  486. This gives you a list of the first line of each unit in the workspace:
  487. .DS
  488. \*(<:>>> ::
  489. HOW'TO GREET:\*(:>
  490. .DE
  491. If you want to change any of these units,
  492. you can type a colon followed by the name of the unit you want:
  493. .DS
  494. \*(<:>>> :GREET\*(:>
  495. .DE
  496. (If the unit you want to change is the last unit you typed in
  497. or changed in this session,
  498. or the last unit that you got an error message about,
  499. then you don't even need to type its name:
  500. the system remembers the name of the unit,
  501. so all you need to do is type a single colon.)
  502. .PP
  503. What happens now is that the whole unit is displayed
  504. (or as much as will fit on the screen if it is big)
  505. with the focus on the line you were last at in the unit.
  506. You can now use all the focus moving keys to position
  507. to the lines you want to change,
  508. and change them.
  509. When you have finished,
  510. you use the
  511. .KY exit
  512. key.
  513. .SH
  514. Errors in Units
  515. .PP
  516. If when you type in or change a unit,
  517. the result has an error in it,
  518. you will get an error message from the \*B system.
  519. This may happen when you press
  520. .KY exit ,
  521. or when you run the unit, depending on the sort of error it is.
  522. For instance,
  523. in this unit,
  524. the parameter is \*(<:x\*(:>,
  525. but \*(<:n\*(:> is used instead:
  526. .DS
  527. \*(<:>>> HOW'TO SQUARE x:
  528.         WRITE n*n
  529. >>> SQUARE 4
  530. *** Can't cope with problem in line 2 of your unit SQUARE
  531.     WRITE n*n
  532. *** The problem is: n has not yet received a value\*(:>
  533. .DE
  534. When you get such a message,
  535. it is very easy to make the necessary correction:
  536. since the unit you want to change is
  537. the last one that you got an error message for,
  538. you only need to type a colon after the prompt:
  539. .DS
  540. \*(<:>>> :
  541. HOW'TO SQUARE x:
  542.     WRITE n*n_________\*(:>
  543. .DE
  544. As you see,
  545. you are positioned at the line that gave the error message.
  546. Now you can either press
  547. .KY delete
  548. and retype the whole line,
  549. or use the other focus-moving keys to focus on only the part that is in error.
  550. .SH
  551. Other Focus Moving Keys
  552. .PP
  553. Apart from
  554. .KY up
  555. and
  556. .KY down
  557. there are six other keys for moving the focus,
  558. two for making the focus smaller:
  559. .KY first
  560. and
  561. .KY last ,
  562. two for enlarging it:
  563. .KY widen
  564. and
  565. .KY extend ,
  566. and two for moving it sideways:
  567. .KY previous
  568. and
  569. .KY next .
  570. .PP
  571. In this case we want to make the focus smaller,
  572. by going to the last part of the line.
  573. Thus,
  574. we can press
  575. .KY last
  576. and we see:
  577. .DS
  578. \*(<:HOW'TO SQUARE x:
  579.     WRITE n*n___\*(:>
  580. .DE
  581. Pressing
  582. .KY delete
  583. deletes the part in the focus,
  584. leaving only a hole:
  585. .DS
  586. \*(<:HOW'TO SQUARE x:
  587.     WRITE ?_\*(:>
  588. .DE
  589. Now we can type the correct expression and then press
  590. .KY exit :
  591. .DS
  592. \*(<:HOW'TO SQUARE x:
  593.     WRITE x*x\*(:>
  594. .DE
  595. Suppose now you have the following unit to solve quadratic equations
  596. (if you don't know what these are,
  597. it doesn't matter):
  598. .DS
  599. \*(<:HOW'TO SOLVE a X2 b X c:
  600.     PUT root (b**2-4*a*c) IN x
  601.     WRITE (-b+x)/2*a, (-b-x)/2*a /
  602.  
  603. *** There's something I don't understand in line 3 of your unit SOLVE
  604.     WRITE (-b+x)/2*a, (-b-x)/2*a /
  605.                   ^
  606. *** The problem is: priorities? use ( and ) to resolve\*(:>
  607. .DE
  608. The system doesn't know whether to divide by \*(<:2\*(:> or \*(<:2*a\*(:>,
  609. so you must insert brackets.
  610. .DS
  611. \*(<:>>> :
  612. HOW'TO SOLVE a X2 b X c:
  613.     PUT root (b**2-4*a*c) IN x
  614.     WRITE (-b+x)/2*a, (-b-x)/2*a /______________________________\*(:>
  615. .DE
  616. Now we want to narrow down to \*(<:2*a\*(:>.
  617. Pressing
  618. .KY last
  619. gives
  620. .DS
  621. \*(<:HOW'TO SOLVE a X2 b X c:
  622.     PUT root (b**2-4*a*c) IN x
  623.     WRITE (-b+x)/2*a, (-b-x)/2*a /________________________\*(:>
  624. .DE
  625. and then
  626. .KY first
  627. gives
  628. .DS
  629. \*(<:HOW'TO SOLVE a X2 b X c:
  630.     PUT root (b**2-4*a*c) IN x
  631.     WRITE (-b+x)/2*a, (-b-x)/2*a /___________\*(:>
  632. .DE
  633. and another
  634. .KY first
  635. gives
  636. .DS
  637. \*(<:HOW'TO SOLVE a X2 b X c:
  638.     PUT root (b**2-4*a*c) IN x
  639.     WRITE (-b+x)/2*a, (-b-x)/2*a /__________\*(:>
  640. .DE
  641. Now
  642. .KY last
  643. gives us
  644. .DS
  645. \*(<:HOW'TO SOLVE a X2 b X c:
  646.     PUT root (b**2-4*a*c) IN x
  647.     WRITE (-b+x)/2*a_, (-b-x)/2*a /\*(:>
  648. .DE
  649. The key
  650. .KY extend
  651. tries whenever possible to extend the focus to the right.
  652. But it sometimes can't,
  653. if what is to the right isn't associated with what is in the focus.
  654. This is the case here:
  655. the comma is associated with the \fIwhole\fP expression \*(<:(-b+x)/2*a\*(:>,
  656. and so
  657. .KY extend
  658. extends to the left instead:
  659. .DS
  660. \*(<:HOW'TO SOLVE a X2 b X c:
  661.     PUT root (b**2-4*a*c) IN x
  662.     WRITE (-b+x)/2*a__, (-b-x)/2*a /\*(:>
  663. .DE
  664. and once more pressing
  665. .KY extend :
  666. .DS
  667. \*(<:HOW'TO SOLVE a X2 b X c:
  668.     PUT root (b**2-4*a*c) IN x
  669.     WRITE (-b+x)/2*a___, (-b-x)/2*a /\*(:>
  670. .DE
  671. Now we have the expression we want,
  672. and typing an opening bracket encloses the whole expression:
  673. .DS
  674. \*(<:HOW'TO SOLVE a X2 b X c:
  675.     PUT root (b**2-4*a*c) IN x
  676.     WRITE (-b+x)/(?_2*a), (-b-x)/2*a /\*(:>
  677. .DE
  678. Now you can use the focus moves to do the same to the second \*(<:2*a\*(:>.
  679. .LP
  680. The focus move keys are very easy to use.
  681. After a little practice you will find they come very naturally.
  682. .SH
  683. Copying
  684. .PP
  685. It is often the case that you want to duplicate a piece of program.
  686. If the focus is on something other than a hole,
  687. the
  688. .KY copy
  689. key copies whatever is in the focus to what is called the
  690. .I "copy buffer"
  691. and lets you know that there is something in the copy buffer
  692. by displaying the words \*(<:[copy\ buffer]\*(:> at the bottom of the screen,
  693. along with the first bit of what is stored.
  694. .PP
  695. If, however, the focus is on a hole,
  696. then the
  697. .KY copy
  698. key copies the contents of the buffer into that hole.
  699. The \*(<:[copy\ buffer]\*(:> message then disappears, though
  700. actually the contents of the buffer remain, so you can continue to use it.
  701. However,
  702. if the contents of the buffer may not be copied there, you just get a bleep;
  703. for instance you can't copy a \*(<:WRITE\*(:> command to a place where
  704. an expression must be.
  705. .PP
  706. You can use the
  707. .KY copy
  708. key for moving things too:
  709. focus on what you want, press
  710. .KY copy ,
  711. press
  712. .KY delete
  713. twice to delete it and
  714. the hole that gets left after the first delete,
  715. move to where you want,
  716. make a hole, and press
  717. .KY copy
  718. again.
  719. .PP
  720. Making a hole is straightforward.
  721. A
  722. .KY newline
  723. always makes a hole on a new blank line
  724. after the line that the focus was positioned on.
  725. An
  726. .KY accept
  727. always takes you to the first hole on a line,
  728. or if there is no hole on the line, then it makes one at the end of the line.
  729. Finally, pressing
  730. .KY first
  731. or
  732. .KY last
  733. enough times makes one,
  734. .KY first
  735. in front of the focus,
  736. .KY last
  737. after it.
  738. .PP
  739. You can use the
  740. .KY copy
  741. key for copying between different units too.
  742. Even if you log out, and come back later, and start using \*B again,
  743. the copy buffer is kept.
  744. .PP
  745. Additionally, if the \*(<:[copy buffer]\*(:> message isn't being displayed,
  746. that is, if the copy buffer is empty,
  747. and you
  748. .KY delete
  749. something, whatever you delete is put into the copy buffer;
  750. similarly if the copy buffer is empty,
  751. each immediate command is stored in the copy buffer.
  752. Thus if you mis-type an immediate command,
  753. you can use
  754. .KY copy
  755. to bring it back, and edit it.
  756. .SH
  757. Renaming and deleting units
  758. .PP
  759. If you change the name of a unit, or the adicity of a \*(<:YIELD\*(:> or \*(<:TEST\*(:>
  760. (such as making a dyadic \*(<:YIELD\*(:> into a monadic one) by changing its heading,
  761. then you get the new unit
  762. .I and
  763. the old one.
  764. So, renaming \*(<:GREET\*(:> into \*(<:HELLO\*(:>, and then giving a \*(<:::\*(:> command
  765. would give:
  766. .DS
  767. \*(<:>>> ::
  768. HOW'TO GREET:
  769. HOW'TO HELLO:
  770. HOW'TO SOLVE a X2 b X c:
  771. HOW'TO SQUARE x:\*(:>
  772. .DE
  773. If you delete the
  774. .I whole
  775. of a unit (by pressing
  776. .KY widen
  777. until the focus is on the whole unit,
  778. and then pressing
  779. .KY delete )
  780. the unit disappears.
  781. Thus deleting \*(<:GREET\*(:> will give you:
  782. .DS
  783. \*(<:>>> ::
  784. HOW'TO HELLO:
  785. HOW'TO SOLVE a X2 b X c:
  786. HOW'TO SQUARE x:\*(:>
  787. .DE
  788. .SH
  789. Changing targets
  790. .PP
  791. You may also use the editor for changing permanent targets.
  792. Just as you use a single colon for editing units,
  793. a single equals followed by the name of a target
  794. will display the contents of the target,
  795. and let you make changes in the usual way.
  796. In fact, you may replace the contents by any
  797. .I expression.
  798. When you press
  799. .KY exit ,
  800. the expression is evaluated, and if all is ok
  801. the value is put in the target.
  802. .SH
  803. Workspaces
  804. .PP
  805. A workspace is a collection of units plus a permanent environment.
  806. You can have several workspaces: to create a new one
  807. you just start \*B up in a new directory in the filestore.
  808. .PP
  809. To move units and targets between workspaces, just use the
  810. .KY copy
  811. key:
  812. start \*B up in the one workspace, save whatever you want to move
  813. in the copy buffer,
  814. exit \*B, move to the destination workspace,
  815. re-enter \*B, and copy the buffer back.
  816. .SH
  817. Record and play
  818. .PP
  819. Sometimes you need to repeat a sequence of keystrokes several times.
  820. For instance, if you want to rename a target in a unit,
  821. you have to do it once for each occurrence of the target.
  822. An easy way to do this is to
  823. .I record
  824. a sequence of keystrokes.
  825. If you press
  826. .KY record ,
  827. the message \*(<:[recording]\*(:> appears at the bottom of the screen,
  828. and any keys that you type thereafter are processed normally
  829. and recorded at the same time,
  830. until you press
  831. .KY record
  832. again.
  833. Then pressing
  834. .KY play
  835. plays those recorded keystrokes back.
  836. .PP
  837. So, for instance, focus on the target you want to rename,
  838. press
  839. .KY record ,
  840. press
  841. .KY delete ,
  842. type the new name, and press
  843. .KY record
  844. again.
  845. Then focus on the next occurrence of the target,
  846. and press
  847. .KY play .
  848. .PP
  849. Keystrokes that cause an error during recording are not recorded.
  850. .SH
  851. Redisplaying the screen
  852. .PP
  853. Sometimes the screen can get messed up
  854. (for instance, if your terminal gets accidentally unplugged).
  855. If this happens, or you don't believe what you see on the screen,
  856. you can always get confirmation by pressing
  857. .KY look .
  858. This causes the screen to be redisplayed.
  859. .SH
  860. Interrupting a running command
  861. .PP
  862. If a command is executing, and you want to stop it,
  863. pressing
  864. .KY interrupt
  865. aborts the command
  866. and gives you a prompt again.
  867. .SH
  868. Incomplete units
  869. .PP
  870. If, when typing in or correcting a command or unit,
  871. you press
  872. .KY exit
  873. and there are still unfilled holes,
  874. the system tells you so,
  875. and you must fill or delete them.
  876. If you want to exit leaving the holes, to fill them later,
  877. use the
  878. .KY interrupt
  879. key.
  880. The system won't let you run an incomplete unit.
  881. .SH
  882. Getting help
  883. .PP
  884. Pressing the
  885. .KY help
  886. key gives you a quick summary of all the keys.
  887. Refer to the ``Quick Reference'' card for a brief reminder of the features of
  888. the \*B language,
  889. and the ``Description of \*B'' for more detailed explanations.
  890. .SH
  891. Running \*B in the background
  892. .PP
  893. If your computer system lets you,
  894. you can also run \*B non-interactively.
  895. In this case \*B commands are read from the standard input, and executed.
  896. You may only use normal \*B commands in this case: no focus moves,
  897. or editing, and no \*(<:::\*(:> or \*(<:==\*(:> commands.
  898.